using System;
using System.Collections.Generic;
using System.Text;

namespace MeltingSnowballs.SmugMugAPI
{
    #region ISmugMugAPI Interface
    /// <summary>
    /// Interface API for communicating with the SmugMug web services.
    /// </summary>
    public interface ISmugMugAPI
    {
        /// <summary>
        /// This method establishes a session and logs a user in based on the specified email address and password. 
        /// </summary>
        /// <param name="emailAddress">The e-mail address of the account to log in to.</param>
        /// <param name="password">The password of the account to log in to.</param>
        /// <param name="apiKey">The API Key of the calling application.</param>
        /// <returns>A SMLoginInfo struct.</returns>
        SMLoginInfo loginWithPassword(string emailAddress, string password, string apiKey);

        /// <summary>
        /// This method establishes a session and logs in with a stored hash, rather than the real password.
        /// </summary>
        /// <param name="userID">The user ID to log in with.</param>
        /// <param name="passwordHash">The password hash value.</param>
        /// <param name="apiKey">The API Key of the calling application.</param>
        /// <returns>A SMLoginInfo struct.</returns>
        SMLoginInfo loginWithHash(string userID, string passwordHash, string apiKey);

        /// <summary>
        /// This method establishes a session which isn't logged in.
        /// </summary>
        /// <param name="apiKey">The API Key of the calling application.</param>
        /// <returns>A SMSessionInfo struct.</returns>
        SMSessionInfo loginAnonymously(string apiKey);

        /// <summary>
        /// This method logs a session out.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        void logout(string sessionID);

        /// <summary>
        /// This method returns a complete tree, starting with Categories and descending into
        /// SubCategories (if any) and Albums (if any) for the specified user.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="nickName">Optional. The NickName of the site.</param>
        /// <param name="heavy">Optional. Include Album Info in the tree as well.</param>
        /// <param name="sitePassword">Optional. The site password.</param>
        /// <returns>An array of SMUserTreeCategory objects.</returns>
        SMUserTreeCategory[] getUsersTree(string sessionID, string nickName, bool heavy, string sitePassword);

        /// <summary>
        /// Gets transfer statitistics for the logged-in user during the given Month and Year.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="month">The month to retrieve stats for.</param>
        /// <param name="year">The year to retrieve stats for.</param>
        /// <returns>An array of SMAlbumStats objects.</returns>
        SMAlbumStats[] getUsersTransferStats(string sessionID, int month, int year);

        /// <summary>
        /// This method returns a list of albums for a given user (either via SessionID or (optional) NickName). If the session is logged in as the requested user, a complete list of albums is returned. Otherwise, only the public albums are returned.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="nickName">Optional. The NickName of the site.</param>
        /// <param name="heavy">Optional. ?</param>
        /// <param name="sitePassword">Optional. The site password.</param>
        /// <returns>An array of SMAlbums.</returns>
        SMAlbum[] getAlbums(string sessionID, string nickName, bool heavy, string sitePassword);

        /// <summary>
        /// This method returns detailed information about the album specified by AlbumID. If the album isn't owned by the Session holder and also isn't public or has a password, an "invalid user" error will be returned. Note that many of the fields are protected for the owner's eyes only. Reduced information is provided to a non-owner.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="albumID">The Album ID.</param>
        /// <param name="password">Optional. The album password.</param>
        /// <param name="sitePassword">Optional. The site password.</param>
        /// <returns>An SMAlbumInfo struct.</returns>
        SMAlbumInfo getAlbumInfo(string sessionID, int albumID, string password, string sitePassword);

        /// <summary>
        /// This method will create an album in the specified category (identified by the CategoryID) with the specified Title. The session must be established with a valid login. Optionally, other arguments may be specified that adjust specific album properties.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="title">The Album Title.</param>
        /// <param name="categoryID">The Category ID that the album belongs to.</param>
        /// <param name="settings">The album settings.</param>
        /// <returns>The ID of the created album.</returns>
        int createAlbum(string sessionID, string title, int categoryID, SMAlbumSettings settings);

        /// <summary>
        /// This method will change the settings on an album specified by AlbumID. The session must be established with a valid login. All settings are optional, if omitted, the current value for that setting is preserved.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="albumID">The ID of the album.</param>
        /// <param name="settings">The updated album settings.</param>
        /// <returns>The ID of the changed album.</returns>
        int changeAlbumSettings(string sessionID, int albumID, SMAlbumSettings settings);

        /// <summary>
        /// This method will re-sort all the photos inside of the album specified by AlbumID. Note that this is a one-time event, and doesn't apply directly to images added in the future by other means.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="albumID">The ID of the album.</param>
        /// <param name="by">What to sort by. Valid values are: FileName, Caption, or DateTime.</param>
        /// <param name="direction">The sort direction. Valid values are: ASC or DESC.</param>
        /// <returns></returns>
        bool reSortAlbum(string sessionID, int albumID, string by, string direction);

        /// <summary>
        /// This method deletes the specified Album and all photos within.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="albumID">The ID of the album to delete.</param>
        /// <returns></returns>
        bool deleteAlbum(string sessionID, int albumID);

        /// <summary>
        /// Gets transfer statitistics for the given Album during the given Month and Year. SmugMug often only keeps the last few months (current + 2 previous), but you never know. :) 
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="albumID">The ID of the album.</param>
        /// <param name="month">The month to retrieve stats for.</param>
        /// <param name="year">The year to retrieve stats for.</param>
        /// <param name="heavy">Optional. Retrieve image stats as well.</param>
        /// <returns>An SMStats structure.</returns>
        SMAlbumStats getAlbumStats(string sessionID, int albumID, int month, int year, bool heavy);

        /// <summary>
        /// This method returns all of the album templates for the logged in user (via SessionID). Templates are only available to Power and Pro users.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <returns>An SMAlbumTemplate structure.</returns>
        SMAlbumTemplate getAlbumTemplates(string sessionID);

        /// <summary>
        /// This method will fetch all the ImageIDs for the album specified by AlbumID. The Album must be owned by the Session holder, or else be Public (if password-protected, a Password must be provided), to return results.. Otherwise, an "invalid user" faultCode will result.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="albumID">The ID of the album.</param>
        /// <param name="heavy">Optional. ?</param>
        /// <param name="password">Optional. The Album password, if set.</param>
        /// <param name="sitePassword">Optional. The Site password, if set.</param>
        /// <returns>An array of image ID's.</returns>
        int[] getImages(string sessionID, int albumID, bool heavy, string password, string sitePassword);

        /// <summary>
        /// This method will return all the URLs for the various sizes of the image specified by ImageID. The Album must be owned by the Session holder, or else be Public (if password-protected, a Password must be provided), to return results. Otherwise, an "invalid user" faultCode will result. Additionally, obvious restrictions on Originals and Larges apply if so set by the owner. They will return as empty strings for those URLs if they're unavailable.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="imageID">The ID of the image.</param>
        /// <param name="templateID">Optional. The template to build the URLs. Valid values are: 3 (Elegant), 4 (Traditional), 7 (All Thumbs), 8 (Slideshow), 9 (Journal).</param>
        /// <param name="password">Optional. The Album password, if set.</param>
        /// <param name="sitePassword">Optional. The Site password, if set.</param>
        /// <returns>An SMImageURLs structure.</returns>
        SMImageURLs getImageURLs(string sessionID, int imageID, int templateID, string password, string sitePassword);

        /// <summary>
        /// This method will return details about the image specified by ImageID. The Album must be owned by the Session holder, or else be Public (if password-protected, a Password must be provided), to return results.. Otherwise, an "invalid user" faultCode will result. Additionally, some fields are only returned to the Album owner.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="imageID">The ID of the image.</param>
        /// <param name="password">Optional. The Album password, if set.</param>
        /// <param name="sitePassword">Optional. The Site password, if set.</param>
        /// <returns>An SMImageInfo structure.</returns>
        SMImageInfo getImageInfo(string sessionID, int imageID, string password, string sitePassword);

        /// <summary>
        /// This method will return camera and photograph details about the image specified by ImageID. The Album must be owned by the Session holder, or else be Public (if password-protected, a Password must be provided), to return results. Otherwise, an "invalid user" faultCode will result. Additionally, the album owner must have specified that EXIF data is allowed. Note that many photos have no EXIF data, so an empty or partially returned result is very normal.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="imageID">The ID of the image.</param>
        /// <param name="password">Optional. The Album password, if set.</param>
        /// <param name="sitePassword">Optional. The Site password, if set.</param>
        /// <returns>An SMImageEXIF structure.</returns>
        SMImageEXIF getImageEXIF(string sessionID, int imageID, string password, string sitePassword);

        /// <summary>
        /// This method updates specific settings for a given image specified by ImageID. If any of the parameters are missing or are empty strings "", they're ignored and the current settings are preserved. Otherwise, they're updated with the new settings. This method can be used to update Captions, Keywords, or to move an image from one Album to another.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="imageID">The ID of the image.</param>
        /// <param name="settings">The updated image settings.</param>
        /// <returns>True if the image settings were changed.</returns>
        bool changeImageSettings(string sessionID, int imageID, SMImageSettings settings);

        /// <summary>
        /// This method changes the Position of an image within it's Album.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="imageID">The ID of the image.</param>
        /// <param name="position">The new position of the image.</param>
        /// <returns>True if the image position was changed.</returns>
        bool changeImagePosition(string sessionID, int imageID, int position);

        /// <summary>
        /// This method will upload a file to the specified Album (identified by AlbumID) with the required parameters.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="albumID">The ID of the album to upload into.</param>
        /// <param name="fileName">The file name of the image.</param>
        /// <param name="caption">Optional. The caption for the image.</param>
        /// <param name="keywords">Optional. The keywords for the image.</param>
        /// <param name="latitude">Optional. The latitude where the image was taken.</param>
        /// <param name="longitude">Optional. The longitude where the image was taken.</param>
        /// <param name="altitude">Optional. The altitude where the image was taken.</param>
        /// <returns>The ID of the image.</returns>
        int uploadImage(string sessionID, int albumID, string fileName, string caption, string keywords, string latitude, string longitude, string altitude);

        //int replaceImage(string sessionID, int imageID, string fileName, string caption, string keywords, string latitude, string longitude, string altitude);

        /// <summary>
        /// This method will upload a file from a specified URL to the specified Album (identified by AlbumID) with the required parameters.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="albumID">The ID of the album to upload into.</param>
        /// <param name="caption">The caption for the image.</param>
        /// <param name="URL">The URL to retrieve the image from.</param>
        /// <param name="keywords">A semi-colon seperated list of keywords.</param>
        /// <param name="latitude">The latitude of the image.</param>
        /// <param name="longitude">The longitude of the image.</param>
        /// <param name="altitude">The altitude of the image.</param>
        /// <param name="byteCount">The size of the image, in bytes.</param>
        /// <param name="MD5Sum">The MD5 hash of the image.</param>
        /// <returns>The ID of the image.</returns>
        int uploadImageFromURL(string sessionID, int albumID, string caption, string URL, string keywords, string latitude, string longitude, string altitude, int byteCount, string MD5Sum);

        /// <summary>
        /// This method deletes the specified Image.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="imageID">The ID of the image to delete.</param>
        /// <returns>The string "SUCCESS" if the image is successfully deleted.</returns>
        string deleteImage(string sessionID, int imageID);

        /// <summary>
        /// Gets transfer statitistics for the given Image during the given Month. SmugMug often only keeps the current month and the one previous, but you never know. :)
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="imageID">The ID of the image.</param>
        /// <param name="month">The month to retrieve stats.</param>
        /// <returns>An SMStats structure.</returns>
        SMImageStats getImageStats(string sessionID, int imageID, int month);

        /// <summary>
        /// This method returns a list of Categories for the specified user (identified by SessionID or (optional) NickName).
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="nickName">Optional. The nickname to get categories for.</param>
        /// <param name="sitePassword">Optional. The Site password, if set.</param>
        /// <returns>An array of SMCategory structs.</returns>
        SMCategory[] getCategories(string sessionID, string nickName, string sitePassword);

        /// <summary>
        /// This method creates a new Category with the given Name.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="name">The name of the new category.</param>
        /// <returns>The Category ID.</returns>
        int createCategory(string sessionID, string name);

        /// <summary>
        /// This method deletes the specified Category.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="categoryID">The ID of the category to delete.</param>
        /// <returns>Returns true if the category is successfully deleted.</returns>
        bool deleteCategory(string sessionID, int categoryID);

        /// <summary>
        /// This method renames the specified Category with new Name.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="categoryID">The ID of the category.</param>
        /// <param name="name">The new name of the category.</param>
        /// <returns>Returns true if the category is successfully renamed.</returns>
        bool renameCategory(string sessionID, int categoryID, string name);

        /// <summary>
        /// This method returns a list of SubCategories for the specified user (identified by SessionID or (optional) NickName) in the specified Category (identified by CategoryID). 
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="categoryID">The ID of the category.</param>
        /// <param name="nickName">Optional. The NickName of the account.</param>
        /// <param name="sitePassword">Optional. The Site password, if set.</param>
        /// <returns>An array of SMSubCategory structs.</returns>
        SMSubCategory[] getSubCategories(string sessionID, int categoryID, string nickName, string sitePassword);

        /// <summary>
        /// This method returns a list of SubCategories for the specified user (identified by SessionID or (optional) NickName). Unlike smugmug.subcategories.get, this returns a complete list, rather than one just for a given Category.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="nickName">Optional. The NickName of the account.</param>
        /// <param name="sitePassword">Optional. The Site password, if set.</param>
        /// <returns>An array of SMSubCategories structs.</returns>
        SMSubCategories[] getAllSubCategories(string sessionID, string nickName, string sitePassword);

        /// <summary>
        /// This method creates a new SubCategory with the given Name.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="name">The name of the SubCategory.</param>
        /// <param name="categoryID">The ID of the category.</param>
        /// <returns>A SubCategory ID.</returns>
        int createSubCategory(string sessionID, string name, int categoryID);

        /// <summary>
        /// This method deletes the specified SubCategory.
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="subCategoryID">The ID of the SubCategory.</param>
        /// <returns>Returns true if the SubCategory is successfully deleted.</returns>
        bool deleteSubCategory(string sessionID, int subCategoryID);

        /// <summary>
        /// This method renames the specified SubCategory with new Name. 
        /// </summary>
        /// <param name="sessionID">The ID of the current session.</param>
        /// <param name="subCategoryID">The ID of the SubCategory.</param>
        /// <param name="name">The new name of the SubCategory.</param>
        /// <returns>Returns true if the SubCategory is successfully renamed.</returns>
        bool renameSubCategory(string sessionID, int subCategoryID, string name);
    }
    #endregion

    #region SMLoginInfo
    public struct SMLoginInfo
    {
        public SMUserInfo User;
        public string PasswordHash;
        public string AccountType;
        public int FileSizeLimit;
        public SMSessionInfo Session;
    };
    #endregion

    #region SMUserInfo
    public struct SMUserInfo
    {
        public string id;
        public string NickName;
        public string DisplayName;
    };
    #endregion

    #region SMSessionInfo
    /// <summary>
    /// Session Information.
    /// </summary>
    public struct SMSessionInfo
    {
        public string id;
    };
    #endregion

    #region SMUserTreeCategory
    /// <summary>
    /// A Category in the user tree.
    /// </summary>
    public struct SMUserTreeCategory
    {
        public int id;
        public string Name;
        public SMUserTreeSubCategory[] SubCategories;
        public SMUserTreeAlbum[] Albums;
    }
    #endregion

    #region SMUserTreeSubCategory
    /// <summary>
    /// A SubCategory in the user tree.
    /// </summary>
    public struct SMUserTreeSubCategory
    {
        public int id;
        public string Name;
        public SMUserTreeAlbum[] Albums;
    }
    #endregion

    #region SMUserTreeAlbum
    /// <summary>
    /// An Album in the user tree.
    /// </summary>
    public struct SMUserTreeAlbum
    {
        public int id;
        public string Title;
    }
    #endregion

    #region SMUserTransferStats
    /// <summary>
    /// User transfer stats
    /// </summary>
    public struct SMUserTransferStats
    {
        public int id;
        public int Bytes;
        public int Tiny;
        public int Thumb;
        public int Small;
        public int Medium;
        public int Large;
        public float Original;
        public SMImageStats[] Images;
    }
    #endregion

    #region SMAlbum
    /// <summary>
    /// Album data.
    /// </summary>
    public struct SMAlbum
    {
        public int id;
        public string Title;
        public SMAlbumCategory Category;
        public SMAlbumSubCategory SubCategory;
    };
    #endregion

    #region SMAlbumCategory
    /// <summary>
    /// Album Category Information.
    /// </summary>
    public struct SMAlbumCategory
    {
        public int id;
        public string Name;
    };
    #endregion

    #region SMAlbumSubCategory
    /// <summary>
    /// Album SubCategory Information.
    /// </summary>
    public struct SMAlbumSubCategory
    {
        public int id;
        public string Name;
    };
    #endregion

    #region SMAlbumInfo
    /// <summary>
    /// Album Information.
    /// </summary>
    public struct SMAlbumInfo
    {
        public int id;
        public SmugMugID Highlight;
        public SmugMugID Category;
        public SmugMugID SubCategory;
        public int Position;
        public string SortMethod;
        public bool SortDirection;
        public int ImageCount;
        public string Title;
        public string Keywords;
        public string Description;
        public string LastUpdated;
        public SmugMugID Community;
        public bool Public;
        public string Password;
        public string PasswordHint;
        public bool Printable;
        public bool Filenames;
        public bool Comments;
        public bool External;
        public bool Originals;
        public bool FamilyEdit;
        public bool FriendEdit;
        public bool HideOwner;
        public bool EXIF;
        public bool Share;
        public bool Header;
        public int TemplateID;
        public bool Larges;
        public bool DefaultColor;
        public bool Clean;
        public bool Protected;
        public bool Watermarking;
        public int WatermarkID;
        public bool SmugSearchable;
        public bool WorldSearchable;
        public bool CanRank;
        public bool Geography;
    };
    #endregion

    #region SMAlbumSettings
    /// <summary>
    /// Album Settings
    /// </summary>
    public struct SMAlbumSettings
    {
        public int? AlbumTemplateID;
        public int? SubCategoryID;
        public int? CommunityID;
        public int? HightlightID;
        public string Description;
        public string Keywords;
        public string Password;
        public string PasswordHint;
        public int? Position;
        public string SortMethod;
        public bool? SortDirection;
        public bool? Public;
        public bool? Filenames;
        public bool? Comments;
        public bool? External;
        public bool? EXIF;
        public bool? Share;
        public bool? Printable;
        public bool? Originals;
        public bool? FamilyEdit;
        public bool? FriendEdit;
        public bool? HideOwner;
        public bool? Header;
        public int? TemplateID;
        public bool? Larges;
        public bool? DefaultColor;
        public bool? Clean;
        public bool? Protected;
        public bool? Watermarking;
        public int? ProofDays;
        public string Backprinting;
        public bool? SmugSearchable;
        public bool? WorldSearchable;
    };
    #endregion

    #region SMAlbumStats
    /// <summary>
    /// Album Stats
    /// </summary>
    public struct SMAlbumStats
    {
        public int id;
        public int Bytes;
        public int Tiny;
        public int Thumb;
        public int Small;
        public int Medium;
        public int Large;
        public float Original;
        public SMImageStats[] Images;
    }
    #endregion

    #region SMAlbumTemplate
    /// <summary>
    /// Album Template information.
    /// </summary>
    public struct SMAlbumTemplate
    {
        public int AlbumTemplateID;
        public string AlbumTemplateName;
        public int HighlightID;
        public string SortMethod;
        public bool SortDirection;
        public bool Public;
        public string Password;
        public string PasswordHint;
        public bool Printable;
        public bool Filenames;
        public bool Comments;
        public bool External;
        public bool Originals;
        public bool EXIF;
        public bool Share;
        public bool Header;
        public bool Larges;
        public bool Clean;
        public bool Protected;
        public bool Watermarking;
        public bool FamilyEdit;
        public bool FriendEdit;
        public bool HideOwner;
        public bool DefaultColor;
        public bool Geography;
        public bool CanRank;
        public int ProofDays;
        public string BackPrinting;
        public bool SmugSearchable;
        public bool WorldSearchable;
        // See http://smugmug.jot.com/WikiHome/1.2.0/smugmug.albumtemplates.get
        // template -> ID
        // community -> ID
        // watermark -> ID
    };
    #endregion

    #region SMImageURLs
    /// <summary>
    /// Image URLs
    /// </summary>
    public struct SMImageURLs
    {
        public string OriginalURL;
        public string LargeURL;
        public string MediumURL;
        public string SmallURL;
        public string ThumbURL;
        public string TinyURL;
        public string AlbumURL;
    };
    #endregion

    #region SMImageInfo
    /// <summary>
    /// Image Information
    /// </summary>
    public struct SMImageInfo
    {
        public int AlbumID;
        public string Caption;
        public int Position;
        public int Serial;
        public int Size;
        public int Width;
        public int Height;
        public string LastUpdated;
        public string FileName;
        public string MD5Sum;
        public int Watermark;
        public string Format;
        public string Keywords;
        public string Date;
        public string OriginalURL;
        public string LargeURL;
        public string MediumURL;
        public string SmallURL;
        public string ThumbURL;
        public string TinyURL;
        public string AlbumURL;
    };
    #endregion

    #region SMImageStats
    /// <summary>
    /// Image Stats
    /// </summary>
    public class SMImageStats
    {
        public int id;
        public int Bytes;
        public int Tiny;
        public int Thumb;
        public int Small;
        public int Medium;
        public int Large;
        public float Original;
    };
    #endregion

    #region SMImageEXIF
    /// <summary>
    /// Image EXIF Data
    /// </summary>
    public struct SMImageEXIF
    {
        public int ImageID;
        public string DateTime;
        public string DateTimeOriginal;
        public string DateTimeDigitized;
        public string Make;
        public string Model;
        public string ExposureTime;
        public string Aperture;
        public int ISO;
        public string FocalLength;
        public string FocalLengthIn35mmFilm;
        public string CCDWidth;
        public string CompressedBitsPerPixel;
        public int Flash;
        public int Metering;
        public int ExposureProgram;
        public string ExposureBiasValue;
        public int ExposureMode;
        public int LightSource;
        public int WhiteBalance;
        public string DigialZoomRatio;
        public int Contrast;
        public int Saturation;
        public int Sharpness;
        public string SubjectDistance;
        public string SubjectDistanceRange;
        public int SensingMethod;
        public string ColorSpace;
        public string Brightness;
    };
    #endregion

    #region SMImageSettings
    /// <summary>
    /// Image Settings
    /// </summary>
    public struct SMImageSettings
    {
        public int AlbumID;
        public string Caption;
        public string Keywords;
    };
    #endregion

    #region SMCategory
    /// <summary>
    /// Category Information.
    /// </summary>
    public struct SMCategory
    {
        public int id;
        public string Title;
    };
    #endregion

    #region SMSubCategory
    /// <summary>
    /// SubCategory Information.
    /// </summary>
    public struct SMSubCategory
    {
        public int id;
        public string Title;
    };
    #endregion

    #region SMSubCategories
    /// <summary>
    /// Subcategories Information.
    /// </summary>
    public struct SMSubCategories
    {
        public int id;
        public string Title;
        public SmugMugID Category;
    };
    #endregion

    #region SmugMugID
    /// <summary>
    /// A SmugMug item ID
    /// </summary>
    public struct SmugMugID
    {
        public int id;
    };
    #endregion

    #region SmugMugException
    public class SmugMugException : Exception
    {
        SmugMugException(int faultCode)
        {
        }
    }
    #endregion
}
